#include "gkt_board.h"
#include "gkt_debug.h"
#include "gkt_gpio.h"
#include "gkt_wakeup.h"
#include "factory_reset_common.h"
#include "gkt_factory_reset.h"

#if defined(GKT_CONFIG_FACTORY_RESET_ENABLE) && GKT_CONFIG_FACTORY_RESET_ENABLE	\
	&& (FACTORY_RESET_LOCATION == GKT_MODULE_LOC_FRONTBOARD) \
	&& defined(GKT_CONFIG_FACTORY_RESET_GPIO_PIN)

#if (0 == GKT_CONFIG_FACTORY_RESET_DETECT_LEVEL)
#define FACTORY_RESET_GPIO_FLAGS	\
	(GKT_GPIO_F_INPUT | GKT_GPIO_F_INPUT_PULL_UP | GKT_GPIO_F_INT_EDGE_FALL \
		| GKT_GPIO_F_INT_DEBOUNCE | GKT_GPIO_F_INT_MASKED)
#else
#define FACTORY_RESET_GPIO_FLAGS	\
	(GKT_GPIO_F_INPUT | GKT_GPIO_F_INPUT_PULL_DOWN | GKT_GPIO_F_INT_EDGE_RAISE \
		| GKT_GPIO_F_INT_DEBOUNCE | GKT_GPIO_F_INT_MASKED)
#endif

typedef struct _factory_reset {
	gkt_factory_reset_notify	notify;
} factory_reset_s;
static factory_reset_s s_factory_reset;

int gkt_factory_reset_is_detected(void)
{
	uint32_t level;
	int retval;

	retval = gkt_gpio_get_pin_level(GKT_CONFIG_FACTORY_RESET_GPIO_PIN, 
				&level);
	return ((GKT_SUCCESS == retval) 
			&& (GKT_CONFIG_FACTORY_RESET_DETECT_LEVEL == level)) ? 1 : 0;
}

static void factory_reset_detect_notify(uint32_t pin)
{
	int detect;

	gkt_unused(pin);
	
	detect = gkt_factory_reset_is_detected();
	gkt_trace("factory_reset_detect: %d\n", detect);
	if (detect && s_factory_reset.notify)
		(*s_factory_reset.notify)(GKT_FACTORY_RESET_TYPE_INDIVIDUAL, detect);
}

void gkt_factory_reset_register_notify(
				gkt_factory_reset_notify notify)
{
	s_factory_reset.notify = notify;
}

int gkt_factory_reset_init(void)
{
	int detected, retval;

	/* config GPIO */
	retval = gkt_gpio_config(GKT_CONFIG_FACTORY_RESET_GPIO_PIN,
					FACTORY_RESET_GPIO_FLAGS, 
					factory_reset_detect_notify);
	if (retval != GKT_SUCCESS) {
		gkt_error("factory_reset: config gpio(0x%x) failed %d\n", 
				GKT_CONFIG_FACTORY_RESET_GPIO_PIN, retval);
		return retval;
	}
	detected = gkt_factory_reset_is_detected();
	gkt_gpio_interrupt_unmask(GKT_CONFIG_FACTORY_RESET_GPIO_PIN);

	if (detected
		&& (GKT_SYSTEM_RESET_WAKEUP == g_system_info.reset_mode)) 
	{
		gkt_info("factory_reset_init: *** WAKEUP ***\n");
		gkt_wakeup_set_source(GKT_WAKEUP_SRC_factory_reset);	
	}
	
	return GKT_SUCCESS;
}

#endif

